package Day3_operator;

//逻辑与，逻辑或，右移，左移，无符号右移案例：
public class demo310 {
    public static void main(String[] args) {
        byte a = -0b1110000;//原码：11110000,-112，反：10001111，补：10010000
        System.out.println("byte a的初始值:"+a);
        byte b = 0b0001111;//原码:00001111,15，补码一样
        System.out.println("byte b的初始值:"+b);
        //这里在进行运算符操作时，会全部转换为int类型，如下面定义的x与转化为int类型后的a的补码都一样
        int x = -0b1110000;
        //原码：10000000 00000000 00000000 01110000,-112
        // 反：11111111 11111111 11111111 10001111
        // 补：11111111 11111111 11111111 10010000

        //逻辑与，逻辑或 案例：
        //a:11111111 11111111 11111111 10010000
        //b:00000000 00000000 00000000 00001111
        int c = (a & b);//全为1才变成1，其余全为0
        int d = (a | b);//全为0才变成0，其余全为1
        //补，反，原：0000000 00000000 00000000 00000000
        System.out.println("a & b的结果："+c);
        //补码：11111111 11111111 11111111 10011111
        // 反码：11111111 11111111 11111111 10011110
        //原码：100000000 00000000 00000000 01100001，-（1+32+67）=-97
        System.out.println("a | b的结果："+d);

        System.out.print("a左移2位的结果：");
        System.out.println(a << 2);//向左移动一定位数，左边去掉，右边补上0
        //补码：11111111 11111111 11111111 10010000
        //左移：11111111 11111111 11111110 01000000
        //反：11111111 11111111 11111110 00111111
        //原：10000000 00000000 00000001 11000000，-（256+128+64）=-448

        System.out.print("a（负数）右移2位的结果：");
        System.out.println(a >> 2); //向右移动一定位数，右边的去掉，左边的补0或者1（正数补0，负数补1）
        //补码：11111111 11111111 11111111 10010000
        //右移：11111111 11111111 11111111 11100100
        //反：11111111 11111111 11111111 11100011
        //原：10000000 00000000 00000000 00011100，-28

        System.out.print("b（正数）右移2位的结果：");
        System.out.println(b >> 2);
        //补码:00000000 00000000 00000000 00001111
        //右移:00000000 00000000 00000000 00000011
        //补，反，原：00000000 00000000 00000000 00000011，3

        System.out.print("a无符号右移2位的结果：");
        System.out.println(a >>> 2);//无符号右移，左边的全部补上0
        //补码：11111111 11111111 11111111 10010000
        //右移：00111111 11111111 11111111 11100100，反码原码不变，数大了不好算，理解就行

    }
}
